package com.sziit.se.highconcurrency.common.result;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sziit.se.highconcurrency.common.constant.Constants.ResponseCode;

import java.util.List;


public class ResultUtil {

    /**
     * 请求成功
     *
     * @param code 响应码
     * @param msg  响应消息
     * @return 消息体
     */
    public static Result result(int code, String msg) {
        return new Result(code, msg);
    }

    /**
     * 请求成功
     *
     * @param msg 响应消息
     * @return 消息体
     */
    public static Result success(String msg) {
        return new Result(ResponseCode.SUCCESS, msg);
    }

    /**
     * 默认返回成功消息
     *
     * @return 消息体
     */
    public static Result success() {
        return success("成功");
    }

    /**
     * 请求失败
     *
     * @param code 响应码
     * @param msg  响应消息
     * @return 消息体
     */
    public static Result error(int code, String msg) {
        return new Result(code, msg);
    }

    /**
     * 请求失败
     *
     * @param msg 响应消息
     * @return 消息体
     */
    public static Result error(String msg) {
        return new Result(ResponseCode.BAD_REQUEST, msg);
    }

    /**
     * 默认返回失败消息
     *
     * @return 消息体
     */
    public static Result error() {
        return error("失败");
    }

    /**
     * 根据布尔值确定返回消息
     *
     * @param success 是否为TRUE
     * @return 消息体
     */
    public static Result auto(Boolean success) {
        return Boolean.TRUE.equals(success) ? success() : error();
    }

    /**
     * 返回数据
     *
     * @param msg  响应消息
     * @param data 响应数据
     * @param <T>  数据类型
     * @return 消息体
     */
    public static <T> DataResult<T> data(String msg, T data) {
        DataResult<T> result = new DataResult<>();
        result.setData(data);
        result.setCode(ResponseCode.SUCCESS);
        result.setMsg(msg);
        return result;
    }

    /**
     * 返回默认消息
     */
    public static <T> DataResult<T> data(T data) {
        return data("成功", data);
    }

    /**
     * 分页返回结果
     *
     * @param page 分页对象
     * @param <T>  返回数据类型
     * @return 消息体
     */
    public <T> PageResult<List<T>> page(IPage<T> page) {
        PageResult<List<T>> result = new PageResult<>();
        result.setCode(ResponseCode.SUCCESS);
        result.setMsg("成功");
        result.setPageNumber(page.getCurrent());
        result.setPages(page.getPages());
        result.setTotal(page.getTotal());
        result.setData(page.getRecords());
        return result;
    }
}
